Pricing Structure for Products
In this article, we will talk about the different prices features and price structures available in Ucommerce. But first, we will cover some basic knowledge that is good to know when looking to understand how prices for products are determined.
Price Groups
There is no price in Ucommerce without Price Groups. The most basic thing to know about pricing for products is that there is always a price group involved. Price groups determine list prices in Ucommerce. It is based on a currency and a VAT rate for the products. A simple example is that if you have three price groups you have three sets of list prices per product in your product catalog. This means that it opens up for qualifying different prices for products (differentiated pricing) based on default behavior or custom logic. We will get to that shortly.
Price groups can be created and deleted directly in the backend. If you delete a price group the prices and the price group will disappear in the backend, but the prices will still persist in the database.
Editing prices in the backend
Under the pricing tab on the product editor for any given product, you will see the different list prices (price per price group) configured. These will all be configured without VAT and have that applied when adding a product to the basket based on the VAT rate configured for the price group.
Product Catalogs and Catalog Context
When we have multiple prices per product, we need to narrow down the right price point for your products. This is done on the Product Catalog resolved in the context of what the visitor is browsing. See also Catalog Structure if you are interested in how this works more in depth.
A price point, or list price, is just a price for a product based on a price group.
The right price point for the product is determined by the catalog, and all products resolved within this catalog will use that price point based on what price group is resolved by the catalog.
Since you are allowed to have products live across different stores and catalogs the pricing will automatically change based on the catalog context and what catalog you visit the product in.
A Note on Differentiated Pricing
As part of narrowing down what the right price point is, it is important to also understand the term of differentiated pricing which is a quite normal scenario to come across in B2B solutions. This essentially means that based on who the customer is, the price will change.
This can be done by changing what Context we are in. On the catalog context, you can either redirect customers to different catalogs based on the customer type which will resemble differentiated pricing. The challenge of that is you would have to maintain all the different catalogs for all the different customer types. You can also choose just to write custom logic that will determine what price group should be used for what customer, and use the APIs to change PriceGroup dynamically for that customer.
A third option is to override what price group is resolved which gives you total control and flexibility to change the pricing mechanism.
See also Register a component if you are interested in how to implement custom business logic.
A note on Price tiers.
Since version 7.16 of Ucommerce supports price tiers for products within each price point. This means that you can configure multiple prices for the same price group, and the right price will be determined based on what the quantity you have in the basket for this product.
This is based on the property called MinQuantity and will qualify the right tier based on the quantities in your basket.
Consider the following example:
Product | PriceGroup | MinQuantity | ListPrice | |
---|---|---|---|---|
Product A | Pricegroup A | 0 | 100 | |
Product A | Pricegroup A | 5 | 75 | |
Product A | Pricegroup A | 10 | 50 | |
Product A | Pricegroup A | 15 | 25 | |
Product A | Pricegroup B | 0 | 1000 | |
Product A | Pricegroup B | 5 | 750 | |
Product A | Pricegroup B | 10 | 500 | |
Product A | Pricegroup B | 15 | 250 |
Say we are in Catalog A, that has price group A and you put 13 of Product A in your basket. Given the matrix above, the list price would then be 50. Should you adjust the quantity to 15 or above, the new price would lower itself automatically to 25 - or you lower the quantities to 4 or 5, the price would instead increase automatically to 75.
No UI support for tier prices in Version 7.16
In version 7.16 there is no UI support for product tiers, however, the new data structure allows you to import product tiers if you want. The price engine will automatically look at the tiers configured.
If you only want a single price tier, the UI will automatically only have a single entry per price group with MinimumQuantity 1. If you have multiple configured, the UI will change the tier with MinimumQuantity 1.
To create Tiered Pricing manually, you need to create a new ProductPrice, that has a new Price with the amount you want, and specifies the MinimumQuantity you want the Tier to use.
You can do this through C# code, f.x. during an import.
var newProductPrice = new ProductPrice { Price = new Price { Amount = new decimal(123.45), PriceGroup = priceGroup }, MinimumQuantity = 10, Product = product }; product.ProductPrices.Add(newProductPrice); newProductPrice.Save();
Or you can do it with SQL in the Database.
DECLARE @PriceId INT DECLARE @ProductId INT = 105 DECLARE @TieredMinimumQuantity INT = 10 DECLARE @NewUnitPrice Money = 123.45 DECLARE @PriceGroupId INT = 6 INSERT INTO [dbo].[uCommerce_Price] ([Amount] ,[PriceGroupId] ,[Guid]) VALUES (@NewUnitPrice ,@PriceGroupId ,NEWID()) SET @PriceId = SCOPE_IDENTITY() INSERT INTO [dbo].[uCommerce_ProductPrice] ([MinimumQuantity] ,[Guid] ,[ProductId] ,[PriceId]) VALUES (@TieredMinimumQuantity ,NEWID() ,@ProductId ,@PriceId)
See also the article on Price Calculations and how to use the APIs